package one_07_OOP.demo05;

import one_07_OOP.demo02.Student;

public class Application {
    public static void main(String[] args) {
        // 多态
        //method01();
        // instanceof
        //method02();
        // 类型转换
        method03();
    }

    public static void method01(){
        // 一个对象的实际类型是确定的；如：
        //new Students();
        //new Person();
        // 可以指向的引用类型就不确定：父类的引用指向子类
        Students s1 = new Students();// Student 能调用的方法都是自己的或者继承父类的方法！
        Person s2 = new Students();// Person 父类型指向子类，但不能调用子类独有的方法
        Object s3 = new Students();//

        s1.run();//son
        s2.run();//son  子类重写了父类的方法，执行子类

        // 对象能执行那些方法主要看对象左边的类型，和右边关系不大
        s1.eat();
        // s2.eat();
        /*注意事项：
        1、多态是方法的多态，属性没有多态
        2、父类和子类的转换，必须有联系，ClassCastException：父子类转换异常
        3、多态存在条件：①继承关系；②方法需要重写；③父类的引用指向子类对象
            无法重写的方法：
            ①、static修饰的方法：static的方法属于类，不属于实例
            ②、final修饰的方法：
            ③、private方法
        * */
    }

    public static void method02(){
        // Object ==> Person ==> Teacher
        Object o = new Teacher();
        System.out.println( o instanceof Teacher);//true
        System.out.println( o instanceof Person);//true
        System.out.println( o instanceof Object);//true
        System.out.println( o instanceof Student);//false
    }

    public static void method03(){
        //类型转换  基本类型转换：自动转换：低转高；强制转换：高转低
        //         引用类型转换：       父转子；         子转父

        // 父                子
        Person tea = new Teacher();
        // tea.go();// 编译错误，子类有，父类没有的方法，编译报错

        // 向下转型 父转子
        // 将Person类型的tea转换为Teacher类型，就可以使用Teacher类型的方法了（子转父）
        Teacher teacher = (Teacher)tea;//强制父转子（高转低）
        teacher.go();//可以使用go()方法

        // 可以简写为
        ((Teacher)tea).go();//go

        // 向上转型 子转父
        Teacher teacher1 = new Teacher();
        teacher1.go();
        Person person = teacher1;
    }
}



